package com._1_8;

import org.junit.Test;

import java.util.function.Consumer;

/**
 * 方法引用（两个冒号）
 * 条件1：箭头右侧只有一行实现体
 * 条件2：参数与返回值对应的上
 * 条件3：只有两个参数，并且参数1作为调用者，参数2作为参数，且顺序不能改变
 * <p>
 * 类名::静态方法 （条件1+2）
 * 实例名::实例方法 （条件1+2）
 * 类名::实例方法 （条件1+2+3）
 */
public class _04_方法引用 {
    static class A {

        public static void printA(Object o) {
            System.out.println("AAA");
        }

    }

    static class B {

        public void printB(Object o) {
            System.out.println("BBB");
        }

    }


    interface C {
        boolean printC(Object o1, Object o2);
    }


    @Test
    public void test() {


        // *         类名::静态方法 （条件1+2）
        Consumer<Object> consumer = o -> {
            A.printA(o);
        };
        Consumer<Object> consumer2 = A::printA;
        System.out.println("类名::静态方法 （条件1+2） ");
        consumer.accept(1);
        consumer2.accept(2);
        System.out.println("==================================================");

        // *   实例名::实例方法 （条件1+2）
        B b = new B();
        Consumer<Object> consumer3 = o -> {
            b.printB(o);
        };
        Consumer<Object> consumer4 = b::printB;
        System.out.println("实例名::实例方法 （条件1+2） ");
        consumer3.accept(2);
        consumer4.accept(2);
        System.out.println("==================================================");

        //
        // * 类名::实例方法 （条件1+2+3）
        C c1 = new C() {
            @Override
            public boolean printC(Object o1, Object o2) {
                return o1.equals(o2);
            }
        };
        System.out.println("类名::实例方法 （条件1+2+3） ");
        C c2 = (o1, o2) -> o1.equals(o2);
        C c3 = Object::equals;
        System.out.println(c1.printC(1, 2));
        System.out.println(c1.printC(1, 2));
        System.out.println(c1.printC(1, 2));

    }

}
